package net.hands.common.ado;

import java.io.Serializable;
import java.util.Date;

import net.hands.common.ID;
import net.hands.common.StringUtils;
import net.hands.common.coll.ArrayUtils;

/**
 * 说明:参数值接口 <br>
 * <p>
 * 这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。
 * </p>
 * 
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public interface IParamsValue extends Serializable {
	/**
	 * 说明:获得值对象数组
	 * 
	 * @return Object[]
	 * @update 2012-8-6 上午10:44:32
	 */
	Object[] getValues();

	/**
	 * 说明:获得key
	 * 
	 * @return String
	 * @update 2012-8-6 上午10:45:00
	 */
	String getKey();

	/**
	 * 
	 * 说明:抽象参数值
	 * 
	 * @update 2012-8-6 上午10:45:27
	 */
	@SuppressWarnings("serial")
	public abstract class AbstractParamsValue implements IParamsValue {
		/**
		 * 值数组
		 */
		private Object[] values;

		/**
		 * 
		 (non-Javadoc)
		 * 
		 * @see net.hands.common.ado.IParamsValue#getValues()
		 * @update 2012-9-25 下午11:20:29
		 */
		@Override
		public Object[] getValues() {
			return values;
		}

		/**
		 * 说明:设置变量对象组
		 * 
		 * @param values
		 * @update 2012-8-6 上午10:45:58
		 */
		public void setValues(final Object[] values) {
			this.values = values;
		}

		/**
		 * 说明:添加值组
		 * 
		 * @param values
		 * @update 2012-8-6 上午10:46:59
		 */
		public void addValues(final Object[] values) {
			if (this.values == null) {
				this.values = values;
			} else {
				this.values = ArrayUtils.add(this.values, values);
			}
		}

		/**
		 * 说明:添加值
		 * 
		 * @param value
		 * @update 2012-8-6 上午10:47:18
		 */
		public void addValue(final Object value) {
			addValues(new Object[] { value });
		}

		/**
		 * 说明:值数组值转字符串 分隔符
		 * 
		 * @return String
		 * @update 2012-8-6 上午10:47:33
		 */
		protected String valuesToString() {
			final StringBuffer sb = new StringBuffer();
			final Object[] values = getValues();
			if (values != null) {
				int i = 0;
				for (final Object v : values) {
					if (i++ > 0) {
						sb.append("-");
					}
					sb.append(valueToString(v));
				}
			}
			return sb.toString();
		}

		/**
		 * 说明:值转字符
		 * 
		 * @param v
		 * @return String
		 * @update 2012-9-15 下午10:11:14
		 */
		public static String valueToString(final Object v) {
			if (v == null) {// 是否为空
				return null;
			}
			// 是否是基本类型
			if (v.getClass().isPrimitive() || v instanceof Number
					|| v instanceof String || v instanceof Boolean) {
				return String.valueOf(v);
			} else if (v instanceof Date) {// 是否是日期类型
				return String.valueOf(((Date) v).getTime());
			} else if (v instanceof ID) {// 是否是主键id
				return valueToString(((ID) v).getValue());
			} else {// 都不是转hash值
				return StringUtils.hash(v);
			}
		}
	}
}
